//该程序主要演示 pthread_creat()最后一个参数的传参的使用

#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
#include <error.h>

struct foo
{
    int a;
    int b;
    int c;
};

void print_ids(const char* whichphread)
{
    //这里默认都可以成成功返回
    printf("%s : pid = %d, ppid = %d, tid = %lu\n",
            whichphread,
            getpid(),
            getppid(),
            pthread_self());
}

void* start_routine(void * argc)
{
    print_ids("new pthread:");

    struct foo* a = (struct foo*)argc;

    printf("new thread : a = {%d, %d, %d}\n", a->a, a->b , a->c);

    //因为要返回值 所以返回NULL
    return NULL;
}

//注意手册中有说到，在编译时要加参数 -pthread 链接pthread库文件
int main(int argc, char* argv[])
{
    print_ids("main pthread");

    //结构体可以直接赋值,线程之间会共享
    struct foo a = {1, 2, 3};

    //创建新线程
    //新线程的id
    pthread_t newthread;
    //phread_create() 函数的返回值 ，成功返回 创建的线程的线程标号id 失败返回 错误状态码 并且会不设置errno
    //函数的参数 1 传入传出参数 会在函数中改变 返回新进程的id  参数2 指定新线程的属性 一般传NULL，表示使用默认属性
    //参数3 函数指针，指向线程的入口函数，新线程从入口开始执行，等到函数结束或者返回该线程结束
    //参数4 给start_routine的参数
    
    int err = pthread_create(&newthread, NULL, start_routine, &a);
    printf("main thread : create a new thread %lu\n", newthread);
    //返回值不等于0 线程创建错误
    if(err)
    {
        error(1, err, "pthread_create");
    }
    sleep(3);
    return 0;
}